5 选择语句

c语言语句:

分类 语句
return语句 return
表达式语句 表达式;
选择语句 if switch
循环语句 while do for
跳转语句 break continue goto
复合语句 几条语句组合成一个
空语句 不执行任何操作

5.1 逻辑表达式

注意:c语言没有Boolean类型,表达式的真假依赖于其结果是0非0

5.1.1 关系运算符

> < >= <=

操作数类型:可以用关系运算符比较整数和浮点数,以及混合类型的操作数。
返回值:c语言的表达式中产生的结果是0或1
优先级于结合性:关系运算符的优先级低于算术运算符。

1
i < j < k;//(i < j) < k

5.1.2 判等运算符

== !=

操作数类型:同关系运算符
返回值:同关系运算符
优先级于结合性:优先级低于关系运算符,左结合
技巧:利用关系运算符和判等运算符返回整数值这一事实

1
(i >= j) + (i == j);//0(大于),1(等于),2(小于)

5.1.3 逻辑运算符

&& \|\| !

操作数类型:真(任何非零值操作数),假(零值)。
返回值:0(假)或1(真)。
优先级于结合性:&&||优先级低于关系运算符和判等运算符,左结合;!优先级同+(正)、-(负)
注意:&&||都对运算符进行短路计算,也就是说,计算机先计算左侧的值,如果通过左侧的值推导出表达式的值就不需要运行计算右侧的值(操作数的副作用也不会发生)。

5.2 if语句

语法:if (表达式) 语句(单独一条)
注意:为语句增加大括号或表达式使用圆括号有时并不是必需的,但会使程序更易读,使编译器更容易理解。

1
2
3
if(lent_num == MAX_LINES){
line_num = 0;
}

5.2.1 复合语句

语法:if(表达式){语句1;语句2;...}

1
2
3
4
if(lent_num == MAX_LINES){
line_num = 0;
page_num ++;
}

5.2.2 else语句

语法:if(表达式) 语句 else 语句

5.2.3 级联if语句

语法

1
2
3
4
5
6
7
if(表达式)
语句
else if(表达式)
语句
else if(表达式)
语句
else
1
2
3
4
5
6
7
8
9
if(n < 0){
printf("n is less than 0\n")
}else{
if(n == 0){
printf("n is equal to 0\n")
}else{
printf("n is greter than 0\n");
}
}

5.2.4 程序:计算股票经纪人的佣金

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
/**
* Calculate a broker's commission
*/

#include <stdio.h>
int main(){
float commission, value;
printf("Enter value of trade:");
scanf("%f", &value);

if (value < 2500.00){
commission = 30.00 + .017 * value;
}else if (value < 6250.00){
commission = 56.00 + .0066 * value;
}else if (value < 20000.00){
commission = 76.00 + .0034 * value;
}else if (value < 50000.00){
commission = 100.00 + .0022 * value;
}else if (value < 500000.00){
commission = 155.00 + .0011 * value;
}else{
commission = 255.00 + .0009 * value;
}

if(commission < 39.00){
commission = 39.00;
}
printf("commission:$%.2f\n\n", commission);

return 0;
}
1
2
3
$ ./broker 
Enter value of trade:6000
commission:$95.60

5.2.5 “悬空else”的问题

规则:c语言遵循的规则是else字句应该属于离它最近的且还未和其他else匹配的if语句。

1
2
3
4
5
if(y != 0)
if(x != 0)
result = x / y;
else
printf("Error:y is equal to 0\n");

5.2.6 条件表达式

又名:三元运算符
语法:表达式1 ? 表达式2 : 表达式3
优先级:低于所有其它运算符
使用场景:return语句、printf函数中、某些类型的宏定义
注意:条件表达式使程序更加短小也更难以阅读,所以最好避免使用

1
2
3
4
int i, j, k;
i = 1;
j = 2;
k = i > (j ? i : j) + j;

5.2.7 模拟布尔值

1
2
3
4
5
6
7
#define TRUE 1
#define FALSE 0
#define BOOL int
...
if(flag == TRUE) ...
if(flag == FALSE) ...
if(!flag) ...

5.3 switch语句

语法:

1
2
3
4
5
6
switch(表达式){
case 常量表达式 : 多条语句
...
case 常量表达式 : 多条语句
default : 多条语句
}

特点:

  1. 不允许由重复的情况标号
  2. 对情况的顺序没有要求(default)不一定要放置在最后
  3. 不要求一定要有default,如果不匹配任何情况又没有default,则什么也不做
组成 说明 特点
控制表达式 switch 控制表达式 整数或字符(也会被当作整数)
情况标号 case 常量表达式 常量表达式中只能存在常量(包括宏)
语句 每个情况标号后边任意数量的语句 c语言中少数几个不需要大括号的地方之一
1
2
3
4
5
6
7
8
9
switch(grade){
case 4: case 3: case 2: case 1:
printf("Passing");
break;
case 0: printf("Failing");
break;
default: printf("Illegal grade");
break;
}

5.3.1 break语句的作用

说明:switch语句实际上是一种基于计算的跳转,如果没有break或其它跳转语句,程序控制将会从一种情况继续到下面一种情况。
注意:break的故意省略需要明确指出以防某些人尝试修正“错误”。

1
2
3
4
5
6
7
switch(grade){
case 4: case 3: case 2: case 1:
num_passing++;
/*FALL THROUGH*/
case 0: total grades++;
break;
}

5.3.2 程序:显示法定格式的日期

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/**
* Prints a date in legal form
*/

#include <stdio.h>
int main(){
int month, day, year;
printf("Enter date (mm/dd/yy):");
scanf("%d /%d /%d", &month, &day, &year);

printf("Dated this %d", day);
switch(day){
case 1:case 21:case 31:
printf("st");break;
case 2:case 22:
printf("nd");break;
case 3:case 23:
printf("th");break;
}
printf(" day of ");
switch(month){
case 1: printf("January");break;
case 2: printf("February");break;
case 3: printf("Marth");break;
case 4: printf("April");break;
case 5: printf("May");break;
case 6: printf("June");break;
case 7: printf("July");break;
case 8: printf("August");break;
case 9: printf("September");break;
case 10: printf("October");break;
case 11: printf("November");break;
case 12: printf("December");break;
}
printf(",20%.2d\n", year);
return 0;
}
1
2
3
$ ./date                        
Enter date (mm/dd/yy):6/21/15
Dated this 21st day of June,2015